home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / tags.c < prev    next >
C/C++ Source or Header  |  1995-02-21  |  2KB  |  130 lines

  1. /* tags.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4.  
  5. /* $Id: tags.c,v 4.11 1995/02/21 17:54:32 espie Exp $
  6.  * $Log: tags.c,v $
  7.  * Revision 4.11  1995/02/21  17:54:32  espie
  8.  * Internal problem: buggy RCS. Fixed logs.
  9.  *
  10.  */
  11.  
  12. #include "defs.h"
  13.  
  14. #include "tags.h"
  15.  
  16. ID("$Id: tags.c,v 4.11 1995/02/21 17:54:32 espie Exp $")
  17.  
  18. #if 0
  19. unsigned long tags_length(t)
  20. struct tag *t;
  21.    {
  22.    unsigned long i;
  23.  
  24.    i = 0;
  25.  
  26.    for (;;)
  27.       {
  28.       switch(t->type)
  29.          {
  30.       case TAG_END:
  31.          return i;
  32.       case TAG_IGNORE:
  33.          t++;
  34.          break;
  35.       case TAG_SKIP:
  36.          t += t->data.scalar;
  37.          break;
  38.       case TAG_SUB:
  39.          i += tags_length(t->data.pointer);
  40.          break;
  41.       case TAG_JUMP:
  42.          i += tags_length(t->data.pointer);
  43.          return i;
  44.       default:
  45.          i++;
  46.          }
  47.       }
  48.    }
  49.  
  50. LOCAL struct tag *copy_scan(dest, orig)
  51. struct tag *dest;
  52. struct tag *orig;
  53.    {
  54.    switch (orig->type)
  55.       {
  56.    case TAG_END:
  57.       return dest;
  58.    case TAG_IGNORE:
  59.       ++orig;
  60.       break;
  61.    case TAG_SKIP:
  62.       orig += orig->data.scalar;
  63.       break;
  64.    case TAG_SUB:
  65.       dest = copy_scan(dest, orig->data.pointer);
  66.       break;
  67.    case TAG_JUMP:
  68.       orig = orig->data.pointer;
  69.       break;
  70.    default:
  71.       *dest++ = *orig++;
  72.       }
  73.    return copy_scan(dest, orig);
  74.    }
  75.  
  76. struct tag *tags_copy(t)
  77. struct tag *t;
  78.    {
  79.    unsigned long i;
  80.    struct tag *c, *e;
  81.    
  82.    i = tags_length(t);
  83.    c = (struct tag *)malloc(sizeof(struct tag) * (i+1));
  84.    e = copy_scan(c, t);
  85.    e->type = TAG_END;
  86.    return c;
  87.    }
  88.  
  89. struct tag *alloc_tags(l)
  90. unsigned long l;
  91.    {
  92.    struct tag *c;
  93.    unsigned long i;
  94.    
  95.    c = ( struct tag *) malloc(sizeof(struct tag) * (l + 1));
  96.    if (!c)
  97.       return 0;
  98.    for (i = 0; i < l; i++)
  99.       c[i].type = TAG_IGNORE;
  100.    c[l].type = TAG_END;
  101.    return c;
  102.    }
  103.  
  104. #endif
  105. /* WARNING: TAG_SUB is not supported */
  106. struct tag *get_tag(t)
  107. struct tag *t;
  108.    {
  109.    forever
  110.       {
  111.       switch (t->type)
  112.          {
  113.       case TAG_END:
  114.          return 0;
  115.       case TAG_IGNORE:
  116.          t++;
  117.          return get_tag(t);
  118.       case TAG_SKIP:
  119.          t += t->data.scalar;
  120.          break;
  121.       case TAG_JUMP:
  122.          t = t->data.pointer;
  123.          break;
  124.       default:
  125.          return t;
  126.          }
  127.       }
  128.    }
  129.       
  130.